<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="./resources/geometry-interfaces-test-helpers.js"></script>
<script>
test(function() {
  var matrix = new DOMMatrix();
  matrix.a = 1;
  matrix.b = 2;
  matrix.c = 3;
  matrix.d = 4;
  matrix.e = 5;
  matrix.f = 6;
  assert_2d_matrix_equals(matrix, [1, 2, 3, 4, 5, 6]);
  var other = new DOMMatrix();
  other.m11 = 6;
  other.m21 = 5;
  other.m31 = 4;
  other.m33 = 3;
  other.m41 = 2;
  other.m43 = 1;
  assert_3d_matrix_equals(other, [6, 0, 0, 0, 5, 1, 0, 0, 4, 0, 3, 0, 2, 0, 1, 1]);
  var result = matrix.multiply(other);
  assert_3d_matrix_equals(result, [6, 12, 0, 0, 8, 14, 0, 0, 4, 8, 3, 0, 7, 10, 1, 1]);
  matrix.multiplySelf(other);
  assert_false(matrix.is2D);
  assert_false(matrix.isIdentity);
  assert_array_equals(matrix.toFloat64Array(), result.toFloat64Array());
  assert_throws_js(TypeError, () => { matrix.multiplySelf({a: 2, m11: 3}) });
}, "DOMMatrix.multiply(other) and DOMMatrix.multiplySelf(other)");

test(function() {
  var matrix = new DOMMatrix();
  matrix.a = 1;
  matrix.b = 2;
  matrix.c = 3;
  matrix.d = 4;
  matrix.e = 5;
  matrix.f = 6;
  assert_2d_matrix_equals(matrix, [1, 2, 3, 4, 5, 6]);
  var other = new DOMMatrix();
  other.m11 = 6;
  other.m21 = 5;
  other.m31 = 4;
  other.m33 = 3;
  other.m41 = 2;
  other.m43 = 1;
  assert_3d_matrix_equals(other, [6, 0, 0, 0, 5, 1, 0, 0, 4, 0, 3, 0, 2, 0, 1, 1]);
  var result = matrix.preMultiplySelf(other);
  assert_3d_matrix_equals(result, [16, 2, 0, 0, 38, 4, 0, 0, 4, 0, 3, 0, 62, 6, 1, 1]);
  assert_array_equals(matrix.toFloat64Array(), result.toFloat64Array());
  assert_throws_js(TypeError, () => { matrix.preMultiplySelf({b: 3, m12: 2}) });
}, "DOMMatrix.preMultiplySelf(other)");
</script>
